package depot;

import java.util.ArrayList;
import java.util.UUID;

import com.thoughtworks.xstream.persistence.PersistenceStrategy;
import com.thoughtworks.xstream.persistence.XmlMap;

import modele.ObjetSimple;

/**
*
* @author phil
*/
public class DepotSimple<M extends ObjetSimple> {
    
    /**
     * Données dans le dépot
     */
    public XmlMap map;
    
    public String nomObjet;
    public String nomDepot;
    
    /**
     * Constructeur
     */
    public DepotSimple(PersistenceStrategy strategy, String nomObjet, String nomDepot) {
        this.map = new XmlMap(strategy);
        this.nomObjet = nomObjet;
        this.nomDepot = nomDepot;
    }
    
    /**
     * Ajout d'un élément dans le dépot
     * @param nouveau Nouvel élément au dépot
     * @return True si l'élément est ajouté, false sinon
     */
    public boolean add(M nouveau) {
        if (this.map.containsKey(nouveau.getId().toString())) {
            return false;
        }
        else {
            this.map.put(nouveau.getId(), nouveau);
            return true;
        }
    }
    
    /**
     * Modifie un élément du dépot
     * @param nouveau Élément modifé
     * @return True si l'élément a été modifié, false sinon
     */
    public boolean modify(M nouveau) {
        if (this.map.containsKey(nouveau.getId())) {
            this.map.put(nouveau.getId(), nouveau);
            return true;
        }
        else {
            return false;
        }
    }
    
    /**
     * Retourne l'élément spécifié
     * @param id ID de l'élément a trouver
     * @return Élément recherché, null s'il n'est pas trouvé
     */
	@SuppressWarnings("unchecked")
	public M get(UUID id) {
        return (M) this.map.get(id);
    }
	
	/**
	 * Retourne l'élément recherché
	 * @param name Nom recherché
	 * @return Élément recherché, null s'il n'est pas trouvé
	 */
	public M get(String name) {
		for (M object : getAllList()) {
			if (object.getNom() == name)
				return object;
		}
		return null;
	}
    
    /**
     * Enlève l'élément spécifié
     * @param target Élément a enlever
     * @return Vrai si l'élément a été enlevé
     */
    public boolean remove(M target) {
        if (this.map.containsKey(target.getId())) {
            this.map.remove(target.getId());
            return true;
        }
        else {
            return false;
        }
    }
    
    @SuppressWarnings("unchecked")
	public ArrayList<M> getAllList() {
        return new ArrayList<M>(this.map.values());
    }
    
    /**
     * Retourne le nombre d'éléments dans le dépôt
     * @return
     */
    public int count() {
    	return this.map.size();
    }
}
